One type of memory is a dynamic random access memory (DRAM). DRAMs are a volatile memory in which the contents of the memory cells leak away over time. The memory cells are periodically refreshed to maintain their values. One mode for periodically refreshing the memory cells includes an auto-refresh or constant bit rate (CBR) refresh. Auto-refresh or CBR refresh is one method of refreshing DRAM memory cells. This method involves stopping normal read and write operations, precharging all memory banks, refreshing a group of memory cells in each bank, reactivating the memory banks, and then continuing with normal read and write operations. The memory cells are refreshed at a frequency such that every memory cell is refreshed within its retention time. The precharge and reactivation of the memory banks reduces the bandwidth of the DRAM because the precharge and reactivation of the memory banks inserts cycles where data is being neither read nor written and no memory cells are being refreshed.
Typical auto-refresh implementations use a DRAM controller to issue auto-refresh commands frequently enough that the entire memory is refreshed within the specified retention time. Because each command is issued separately, a user may schedule the auto-refreshes to occur when the DRAM is not being actively read or written, or whenever it is most bandwidth efficient to do so. These scheduling strategies may reduce the bandwidth penalty; however, they are still insufficient for some applications.